package hee;

import hee.model.SungJuk2VO;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
        //메소드로
public class J21SungJuk {
	
//숫자를 특정형식에 맞춰 츨력하는 도우미 클래스
//NumberFormat  => 숫자를 특정한 숫자로 출력
//DecimalFormat => 넘버보다 쓰기 편한게 DecimalFormat
//format 메서드에 특정패턴 (0,#)을 이용해서 //0,# 역학인???????????
//다양한 형식으로 숫자를 출력할 수 있음	
	public static void main(String[] args) {
		
		//m은 : 메모리 데이타,저장할 데이터
		ArrayList<SungJuk2VO>mdb = new ArrayList<>();
		
		String dfmt1 = "000.00";
		String dfmt2 = "###.##";
		String hr = "---------------------";		
		String newMsg1 = "새로운 성적데이터를 입력합니다";
		String newMsg2 = "이름 국어 영어 수학순으로  입력세요";
		String newMsg3 = "등록완료";
		
		String newMsg4 = "계속 입력하시겠습니까?(0:예,1:아니오)";
		String newMsg5 = "성적 등록 실패 - 숫자만 입력하세요!";
		String newMsg6 = "성적 등록 실패! - 알수없는 오류 발생 ";
		
		
		String readMsg1 = "전체 성적데이터 출력";
		String readMsg2 = "검색할 성적데이터의 이름을 입력하세요";
		String readMsg3 = "데이터를 찾았습니다!";
		String readMsg4 = "찾는 데이터가 없습니다.";
		
		//update 수정
		String modifyMsg1= "기존 성적 데이터의 이름을 입력하세요";//수정할때 수정값은 기본이고 수정하지 않을 값도 같이 너어줘야함. 테크닉!!
		String modifyMsg2= "수정할 데이터의 이름을 입력하세요";
		String modifyMsg3= "이름 국어 영어 수학 순으로 입력하세요";
		String modifyMsg4= "수정 결과는 다음과 같습니다.";
		String modifyMsg5= "찾는 데이터가 없어요";  //수정되지 않을시 찾는 데이타 없어여 나옴.
		
		String removeMsg1="특정 성적 데이터를 삭제합니다.";
		String removeMsg2="삭제할 데이터의 이름ㅇ르 입력하세요";
		String removeMsg3="성골적으로 삭제 되었습니다.";
		String removeMsg4="삭제할 데이터를 찾지 못했습니다.";
		
	

		
		//성적 데이터 입력 create(입력)
		Scanner sc=new Scanner(System.in);
		SungJuk2VO sj = null;
		System.out.println(newMsg1);
		System.out.println(newMsg2);
		
		while(true){
			try{
			String name =sc.next();  //이름입력
			int kor =sc.nextInt();  //국어입력
			int eng =sc.nextInt(); //영어입력
			int mat =sc.nextInt();  //수학입력
			
			sj = new SungJuk2VO(name,kor,eng,mat);
			
			sj.setTot(sj.getKor() + sj.getEng() +sj.getMat());
			DecimalFormat df=new DecimalFormat(dfmt1);  //문자로 나타내준다 dfmt1 //날짜 출력 ~~ 포멧썼는데..
			String avg = df.format((double)sj.getTot()/3);  //결과받기
			sj.setAvg(Double.parseDouble(avg)); //문자를 실수로 parse
			
			
			sj.setAvg((double)sj.getTot()/3);
			switch((int)sj.getAvg()){
			case 10 : case 9: sj.setGrd('수'); break;
			case 8 :          sj.setGrd('우'); break;
			case 7 :          sj.setGrd('미'); break;
			case 6 :          sj.setGrd('양'); break;
		            default : sj.setGrd('가');	
			   
			detault : sj.setGrd('가');
			}
			
			mdb.add(sj); //arraylist에 데이터 추가!
			
			//계속 입력여부 확인
			//성적 데이터 입력 retrieve(조회)
			System.out.println(newMsg3);
			System.out.println(newMsg4);
			if(sc.nextInt()==1)break;
			
			
			}catch(InputMismatchException ime){
				sj=null; //객체제거
				sc=new Scanner(System.in);//입력초기화
				System.out.println(newMsg5);
			}catch(Exception e){
				sj=null;
				e.printStackTrace(); //자세한 오류내용 출력
				System.out.println(newMsg6);
			}
		}//while
		System.out.println(hr);
		
		
		
	
		System.out.println(readMsg1);
		StringBuilder sb = new StringBuilder();
		for(SungJuk2VO s : mdb){
			sb.append(s.toString()).append("\n");
		}
		System.out.println(sb);
		System.out.println(hr);
		
		//성적 데이터 검색
		System.out.println(readMsg2);
		String key =sc.next(); //이름 입력받음
		SungJuk2VO findOne = null;  //findOne에서 널 선언, 방만잡고 체크인안한상태, 메모리 확보만,
		for(SungJuk2VO s : mdb){
			if (s.getName().contains(key)){  //성적데이타 저장된곳 mdb
			                                                     //contains 포함되있는지
		
			findOne = s; //검색된 데이터를 findOneㅇ 저장             s: 국어, 영, 수, 평균,
			break;
			
		}	//if
			
			
		}//for
		if(findOne != null){
			System.out.println(findOne);
		}else{
		    System.out.println(readMsg4);
		}
		
		//성적 데이터 입력 update
		findOne = null;  //수정할 데이터
		int position = 0;  //몇번째에 있는 값인지 찾느다(데이터 위치)
		System.out.println(modifyMsg1);
		System.out.println(modifyMsg2);
		key=sc.next();
		for(SungJuk2VO s:mdb){//dmb에 있는 데이터를 찾아서 s로 찰차례대로 끄집어 낸다. 
			if(s.getName().equals(key)){
				findOne = s; break;  //s의 값을 외부변수 findOne에 빼내야 하는데.. 
			}//if
			++position;
		}//for
			if(findOne !=null){
				System.out.println(findOne);
				System.out.println(modifyMsg3);
				findOne = new SungJuk2VO(sc.next(), sc.nextInt(),
						sc.nextInt(), sc.nextInt()); //따로 변수 선언없이 바로 들어간다. sc.next() *4
			
				//수정된 데이터에 대해
				//다시 총점/평균/학점. 계산
				
				findOne.setTot(findOne.getKor() + findOne.getEng() +findOne.getMat());
				DecimalFormat df=new DecimalFormat(dfmt1);  //문자로 나타내준다 dfmt1 //날짜 출력 ~~ 포멧썼는데..
				String avg = df.format((double)findOne.getTot()/3);  //결과받기
				findOne.setAvg(Double.parseDouble(avg)); //문자를 실수로 parse
				
				
				findOne.setAvg((double)findOne.getTot()/3);
				switch((int)findOne.getAvg()){
				case 10 : case 9: findOne.setGrd('수'); break;
				case 8 :          findOne.setGrd('우'); break;
				case 7 :          findOne.setGrd('미'); break;
				case 6 :          findOne.setGrd('양'); break;
			            default : findOne.setGrd('가');	
				   
				detault : findOne.setGrd('가');
				}
				
				//수정된 입력값들을
				//arraylist mdb에 반영
				mdb.set(position, findOne);
				
				System.out.println(modifyMsg4);
				System.out.println(mdb.get(position));
				
				
				
				
			}else{
				System.out.println(modifyMsg5);
				
			}
			System.out.println(hr);
			
			
		
		
		//성적 데이터 입력 delete
		System.out.println(removeMsg1);
		System.out.println(removeMsg2);
		key=sc.next();  //일단 삭제할 데이타 위치값 아는게 우선
		boolean findOk=false;//찾았는지 못찾았는지 만 알면됨
		position =0;
		
		for(int i= 0;i<mdb.size();++i){ //mdb.size() 전체데이터 사이즈 알때까지
			SungJuk2VO s=mdb.get(i); //mdb
			if(s.getName().equals(key)){
			findOk=true;
			position = i; 
			break;
			}
			
		}
		
		if(findOk){
			mdb.remove(position); //삭제
		System.out.println(removeMsg3);
		
		sb=new StringBuilder();
		for(SungJuk2VO s : mdb){
			sb.append(s.toString()).append("\n");
		}
		System.out.println(sb);
		}else{
			System.out.println(removeMsg4);
		}

	}//main

}//class

